home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / tools / cpx_acc / cpxbasic / sources / cpx_main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-22  |  7.6 KB  |  419 lines

  1. #define ___MAIN_C___
  2.  
  3. #include <tos.h>
  4. #include "glo.h"
  5. #include "tokstr.h"
  6. #include "xcontrol.h"
  7.  
  8. /********************************************************************/
  9. #define MESSAGE -1
  10. #define DTR        (1<<4)
  11.  
  12. /********************************************************************/
  13. EXTERN VOID _FreeAll        ( VOID                                );
  14. GLOBAL CPX_INFO *CDECL cpx_init( XCPB *Xcpb                        );
  15. GLOBAL WORD CDECL cpx_call     ( GRECT *work                        );
  16. GLOBAL VOID CDECL cpx_draw     ( GRECT *clip                        );
  17. GLOBAL VOID CDECL cpx_wmove    ( GRECT *work                        );
  18. GLOBAL VOID CDECL cpx_timer    ( WORD *evnt                        );
  19. GLOBAL VOID CDECL cpx_key    ( WORD kstate, WORD key, WORD *evnt );
  20. GLOBAL VOID CDECL cpx_close    ( WORD flag                            );
  21. GLOBAL VOID CDECL cpx_button(MRETS *mrets,WORD nclicks,WORD *event);
  22. GLOBAL VOID CDECL cpx_mouse1(MRETS *mrets,WORD *event);
  23. GLOBAL VOID CDECL cpx_mouse2(MRETS *mrets,WORD *event);
  24. GLOBAL VOID do_draw(void);
  25.  
  26. /********************************************************************/
  27. extern  int interactive;
  28. extern    char charscreen[22][32];
  29.  
  30. LOCAL    XCPB    *cpx;
  31. GLOBAL    MFDB    ScreenMFDB;
  32. GLOBAL    WORD    errno;
  33. GLOBAL    WORD    pxy[10],
  34. work_in[12],
  35. work_out[57],
  36. vdihandle,
  37. phys_vdihandle;
  38.  
  39. static mask=MU_KEYBD|MU_TIMER|MU_M2;
  40. static MOBLK m1={1,0,0,8,176};
  41. /* ACHTUNG: die x,y,w,h-Komponenten von m2 und xywh sind identisch! */
  42. extern MOBLK m2;
  43. extern    GRECT    xywh;
  44.  
  45.  
  46. LOCAL CPX_INFO cpxinfo =
  47. {    
  48.         cpx_call,
  49.         cpx_draw,
  50.         cpx_wmove,
  51.         cpx_timer,
  52.         cpx_key,
  53.         cpx_button,
  54.         cpx_mouse1,
  55.         cpx_mouse2,
  56.         NULL,
  57.         cpx_close
  58. };
  59.  
  60. GLOBAL char *cpx_buffer;    /* residenter CPX-Buffer */
  61. /********************************************************************/
  62. GLOBAL CPX_INFO *CDECL cpx_init( XCPB *Xcpb )
  63. {
  64. #ifdef TT_VERS
  65.     long cpu,fpu;
  66.     int erg;
  67. #endif
  68.     if(Xcpb!=NULL) cpx=Xcpb;
  69.  
  70. #ifdef TT_VERS
  71. /* Ich hoffe einfach mal, daß hier kein TT-Code erzeugt wird */
  72.     erg=cpx->getcookie('_CPU',&cpu);
  73.     erg|=cpx->getcookie('_FPU',&fpu);
  74.     if(erg||cpu<20||!(fpu&0x000EFFFFL))
  75.     {
  76.         form_alert(1,"[3][ Auf diesem Rechner ist die nötige|"
  77.                        " CPU oder FPU nicht vorhanden!][ BYE ]");
  78.         return 0;
  79.     }
  80. #endif
  81.  
  82.     cpx_buffer=cpx->Get_Buffer();
  83.     cpx_buffer[0]='C'-'A';
  84.     cpx_buffer[1]=0;
  85.     if(cpx->booting)
  86.     {
  87.         cpx_buffer[0]=Dgetdrv();
  88.         Dgetpath(cpx_buffer+1,0);
  89.     }
  90.     Ongibit(DTR);
  91.  
  92.     return &cpxinfo;
  93. }
  94.  
  95. static void SetMask(GRECT *grect)
  96. {
  97.     m1.m_x=grect->g_x;
  98.     m1.m_y=xywh.g_y;
  99.     (cpx->Set_Evnt_Mask)(mask,&m1,&m2,20);
  100. }
  101.  
  102. GLOBAL WORD CDECL cpx_call( GRECT *work )
  103. {
  104.     int i,*wk=work_in;
  105.     
  106.     ScreenMFDB.fd_addr=NULL;
  107.  
  108.     *wk++=vdihandle=phys_vdihandle=cpx->handle;
  109.     for(i=9;i>0;i--) *wk++=0;
  110.     *wk=2;
  111.     v_opnvwk( work_in, &vdihandle, work_out);    /* Bildschirm öffnen! */
  112.     if(vdihandle==0)
  113.     {    
  114.         form_alert(1,"[3][Das VDI will kein CPX-BASIC ...][ Tja ]");
  115.         return FALSE;
  116.     }
  117.  
  118.     xywh.g_x=work->g_x;
  119.     xywh.g_y=work->g_y;
  120.  
  121.     StartBASIC();
  122.  
  123.     do_draw();
  124.  
  125.     SetMask(work);
  126.     return TRUE;
  127. }
  128.  
  129. GLOBAL VOID CDECL cpx_draw( GRECT *clip )
  130. {
  131.     static GRECT *cp, cl;
  132.     static WORD color_index[2]={
  133.         BLACK,WHITE    };
  134.  
  135.     v_hide_c(vdihandle);
  136.     cl=*clip;
  137.     cp=(cpx->GetFirstRect)(&cl);
  138.     while( cp!=NULL )
  139.     {
  140.         cl=*cp;
  141.         pxy[0]=cl.g_x - xywh.g_x;
  142.         pxy[1]=cl.g_y - xywh.g_y;
  143.         pxy[2]=cl.g_w + pxy[0] - 1;
  144.         pxy[3]=cl.g_h + pxy[1] - 1;
  145.  
  146.         pxy[4]=cl.g_x;
  147.         pxy[5]=cl.g_y;
  148.         pxy[6]=cl.g_x + cl.g_w - 1;
  149.         pxy[7]=cl.g_y + cl.g_h - 1;
  150.  
  151.         vrt_cpyfm(vdihandle, MD_REPLACE, pxy, &cpx_mfdb, &ScreenMFDB, color_index);
  152.  
  153.         cp=(cpx->GetNextRect)();
  154.     }
  155.     v_show_c(vdihandle,1);
  156.     DirtyScreen=FALSE;
  157. }
  158.  
  159. GLOBAL VOID do_draw(void)
  160. {
  161.     cpx_draw(&xywh);
  162. }
  163.  
  164. GLOBAL VOID CDECL cpx_wmove( GRECT *work )
  165. {
  166.     xywh.g_x=work->g_x;
  167.     xywh.g_y=work->g_y;
  168. }
  169.  
  170. GLOBAL VOID CDECL cpx_timer( WORD *evnt )
  171. {    
  172.     extern int fptime;
  173.     extern void DATAfclose(int);
  174.     if(fptime>0)
  175.     {
  176.         fptime--;
  177.         DATAfclose(0);
  178.     }
  179.     if(DirtyScreen)        /* Bild muss neu gezeichnet werden    */
  180.     {    
  181.         do_draw();
  182.     }
  183.     if(ContBASIC()=='STOP')        /* Das BASIC ausführen ...    */
  184.     {    
  185.         cpx_close(0);
  186.         *evnt=1;
  187.     }
  188. }
  189.  
  190.  
  191. LOCAL void DoString(char *str)
  192. {
  193.     while(*str)
  194.     {
  195.         KeyBuffer[woff++]=*str++;
  196.         if(woff>=KB_SIZE) woff=0;
  197.     }
  198. }
  199.  
  200. enum {string,fselbas,fseltxt,space,nothing};
  201.  
  202. LOCAL char *extensions[]=
  203. {
  204.     " '",
  205.     " FSEL$ '*.BAS'",
  206.     " FSEL$ '*.TXT'",
  207.     " ",
  208.     ""
  209. };
  210.  
  211. LOCAL void CopyKey(int what,int extra)
  212. {
  213.     DoString(tok_strings[what]);
  214.     DoString(extensions[extra]);
  215. }
  216.  
  217. #pragma warn -par
  218. GLOBAL VOID CDECL cpx_key( WORD kstate, WORD key, WORD *evnt )
  219. {
  220.     extern char ctrl;
  221.     int i,x;
  222.     char **str,*s;
  223.     
  224.     if(key==0x6200)
  225.     {
  226.         /* Help */
  227.         Putchar('\n');
  228.         str=tok_strings;
  229.         x=0;
  230.         for(i=0;i<NUM_TOKS;i++,str++)
  231.         {
  232. #define ENDM 32
  233.             s=*str;
  234.             if(x+(int)strlen(s)>=ENDM)
  235.             {
  236.                 if(x<ENDM) Putchar('\n');
  237.                 x=0;
  238.             }
  239.             x+=Printf("%s ",s);
  240.         }
  241.         key='\r';
  242.     }
  243.     if(kstate&4) /* ctrl pressed */
  244.     {
  245.         kstate&=3; /* shift - Tasten */
  246.         key&=0xff00;
  247.         if(!kstate&&key==0x2e00)
  248.         {
  249.             /* Ctrl-C */
  250.             /* CTRL-C und CTRL-Q flag setzen */
  251.             *((int*)&ctrl)=-1;
  252.             return;
  253.         }
  254.         if(interactive)
  255.         {
  256.             x=space;
  257.             switch(key)
  258.             {
  259.                 case 0x3000:
  260.                     /* Ctrl-B */
  261.                     i=tokgosub;
  262.                     break;
  263.                 case 0x2e00:
  264.                     /* Ctrl-C mit Shift */
  265.                     i=tokcont;
  266.                     x=nothing;
  267.                     break;
  268.                 case 0x2000:
  269.                     /* Ctrl-D */
  270.                     i=tokdata;
  271.                     break;
  272.                 case 0x1200:
  273.                     /* Ctrl-E */
  274.                     i=tokrun;
  275.                     x=kstate?fselbas:string;
  276.                     break;
  277.                 case 0x2100:
  278.                     /* Ctrl-F */
  279.                     i=tokfor;
  280.                     if(kstate)
  281.                     {
  282.                         i=tokfopen;
  283.                         x=fseltxt;
  284.                     }
  285.                     break;
  286.                 case 0x2200:
  287.                     /* Ctrl-G */
  288.                     i=tokgoto;
  289.                     break;
  290.                 case 0x1700:
  291.                     /* Ctrl-I */
  292.                     i=tokif;
  293.                     break;
  294.                 case 0x2600:
  295.                     /* Ctrl-L */
  296.                     i=toklist;
  297.                     break;
  298.                 case 0x3200:
  299.                     /* Ctrl-M */
  300.                     i=tokmerge;
  301.                     x=kstate?fselbas:string;
  302.                     break;
  303.                 case 0x3100:
  304.                     /* Ctrl-N */
  305.                     i=toknext;
  306.                     break;
  307.                 case 0x1800:
  308.                     /* Ctrl-O */
  309.                     i=tokload;
  310.                     x=kstate?fselbas:string;
  311.                     break;
  312.                 case 0x1000:
  313.                     /* Ctrl-Q */
  314.                     i=tokbye;
  315.                     x=nothing;
  316.                     break;
  317.                 case 0x1300:
  318.                     /* Ctrl-R */
  319.                     i=tokreturn;
  320.                     x=nothing;
  321.                     break;
  322.                 case 0x1f00:
  323.                     /* Ctrl-S */
  324.                     i=toksave;
  325.                     x=kstate?fselbas:string;
  326.                     break;
  327.                 case 0x1400:
  328.                     /* Ctrl-T */
  329.                     i=tokthen;
  330.                     break;
  331.             }
  332.             CopyKey(i,x);
  333.         }
  334.         else /* not interactive */
  335.         {
  336.             switch(key)
  337.             {
  338.                 case 0x1f00:
  339.                     /* Ctrl-S */
  340.                     ctrlsq=0;
  341.                     return;
  342.                 case 0x1000:
  343.                     /* Ctrl-Q */
  344.                     ctrlsq=-1;
  345.                     return;
  346.             }
  347.         }
  348.     }
  349.     else /* ctrl not pressed */
  350.     {
  351.         KeyBuffer[woff++]=key;
  352.         if(woff>=KB_SIZE) woff=0;
  353.     }
  354. }
  355.  
  356. GLOBAL VOID CDECL cpx_close( WORD flag )
  357. {
  358.     extern void DATAfclose(int);
  359.     DATAfclose(1);
  360.     _FreeAll();
  361.     v_clsvwk( vdihandle );
  362. }
  363.  
  364.  
  365. #pragma warn -par
  366. GLOBAL VOID CDECL cpx_mouse2(MRETS *mrets,WORD *event)
  367. {
  368.     mask=MU_KEYBD|MU_TIMER|MU_M2;
  369.     if(m2.m_out==0)
  370.     {
  371.         mask|=MU_M1;
  372.         m2.m_out=1;
  373.     }
  374.     else
  375.     {
  376.         m2.m_out=0;
  377.     }
  378.     SetMask(&xywh);
  379. }
  380.  
  381. static int buttons,cury;
  382.  
  383. GLOBAL VOID CDECL cpx_mouse1(MRETS *mrets,WORD *event)
  384. {
  385.     int curx=(mrets->x-xywh.g_x)>>3,ch;
  386.     
  387.     if(buttons&&(buttons=mrets->buttons)!=0)
  388.     {
  389.         if(curx>=0&&curx<=31&&cury>=0&&cury<=21)
  390.         {
  391.             if((ch=charscreen[cury][curx])!=0)
  392.             {
  393.                 KeyBuffer[woff++]=ch;
  394.                 if(woff>=KB_SIZE) woff=0;
  395.             }
  396.             cpx_timer(event);
  397.         }
  398.     }
  399.     mrets->x=(curx<<3)+xywh.g_x;
  400.     SetMask((GRECT*)&mrets->x);
  401. }
  402.  
  403. GLOBAL VOID CDECL cpx_button(MRETS *mrets,WORD nclicks,WORD *event)
  404. {
  405.     if(buttons==0)
  406.     {
  407.         buttons=1;
  408.         cury=(mrets->y-xywh.g_y)>>3;
  409.         cpx_mouse1(mrets,event);
  410.     }
  411.     if(nclicks>1)
  412.     {
  413.         KeyBuffer[woff++]='\r';
  414.         if(woff>=KB_SIZE) woff=0;
  415.     }
  416. }
  417.  
  418. #pragma warn +par
  419.